package service;

import dao.ItemDAO;
import dao.ItemDAOImpl;
import dao.OrderDAO;
import dao.OrderDAOImpl;
import entity.Order;
import java.util.List;

/**
 * 订单服务类 (业务逻辑层)
 */
public class OrderService {

    // 订单DAO，用来操作订单相关的数据库表
    private OrderDAO orderDAO;
    // 商品DAO，因为创建订单时需要检查商品信息，所以也需要它
    private ItemDAO itemDAO;

    /**
     * 构造方法：创建需要的DAO实例
     */
    public OrderService() {
        this.orderDAO = new OrderDAOImpl();
        this.itemDAO = new ItemDAOImpl();
    }

    /**
     * 核心业务：创建一个新订单
     */
    public boolean createOrder(int buyerId, int itemId) {
        //  第一步：根据商品ID，去数据库里查一下这个商品到底存不存在，信息是什么
        var item = itemDAO.getItemById(itemId);

        //检查：如果商品不存在（比如ID输错了），就提示错误，返回失败
        if (item == null) {
            System.out.println("商品不存在！");
            return false;
        }

        // 检查：商品虽然存在，但状态是不是“在售”？
        // 如果已经是“已售”或者“下架”了，就不能再买了
        if (!"在售".equals(item.getStatus())) {
            System.out.println("商品已下架或已售出！");
            return false;
        }

        // 4. 所有检查都通过了，开始创建订单
        // 新建一个Order对象，把买家ID、商品ID和商品价格传进去
        Order order = new Order(buyerId, itemId, item.getPrice());

        // 调用OrderDAO的方法，把这个新订单保存到数据库里
        boolean success = orderDAO.addOrder(order);

        // 如果订单创建成功了，必须同步更新商品的状态
        if (success) {
            // 调用ItemDAO的方法，把刚才卖掉的商品状态从“在售”改成“已售”
            // 这样别人就不能再买这个商品了，保证数据一致
            itemDAO.updateItemStatus(itemId, "已售");
            System.out.println("订单创建成功！商品状态已更新为【已售】。");
        }
        return success;
    }

    /**
     * 根据买家ID，查询这个买家的所有订单
     */
    public List<Order> getOrdersByBuyerId(int buyerId) {
        return orderDAO.getOrdersByBuyerId(buyerId);
    }

    /**
     * 更新一个订单的状态
     */
    public boolean updateOrderStatus(int orderId, String status) {
        return orderDAO.updateOrderStatus(orderId, status);
    }

    /**
     * 取消一个订单
     */
    public boolean cancelOrder(int orderId) {
        // 先根据订单ID，把这个订单的信息从数据库里查出来
        Order order = orderDAO.getOrderById(orderId);

        // 检查：这个订单是否存在？
        if (order != null) {
            // 如果订单存在，取消订单的同时，要把对应的商品状态恢复
            // 比如用户买了又取消，商品就应该从“已售”变回“在售”，让别人可以继续买
            itemDAO.updateItemStatus(order.getItemId(), "在售");

            // 再把订单本身的状态改成“已取消”
            return orderDAO.updateOrderStatus(orderId, "已取消");
        }
        System.out.println("订单不存在，无法取消！");
        return false;
    }
}